#ifndef _GSOLVERBBPV3NOWAITMASTER_H_
#define _GSOLVERBBPV3NOWAITMASTER_H_

#include "gsolverBBPv3NoWait.h"

#include "gsupplyLinkProblem.h"
#include "gsupplyLinkSolution.h"
#include "glowerbound.h"

/**
 * A BBP solver : starts with jobs with last due dates
 *
 * Dans cette version 3 de la BBP, on demarre avec les jobs reordonnes dans le sens des dates dues croissantes. Mais
 * contrairement a l'exploration brutale de la version 2, cette fois on ne considere pas n'importe quel numero de batch.
 * Pour chaque job, on choisit de le rajouter soit dans un batch deja existant dont la capacite residuel est suffisante
 * pour stocker le nouveau job, soit dans un nouveau batch.
 *
 * Le nouveau batch est ordonnance avant les autres batchs deja crees.
 *
 * ATTENTION : Pour que cette solution soit optimale, sachant que l'on
 * part d'un probleme pour lequel les jobs sont classes par date due croissante, il est egalement necessaire que le cout de stockage
 * de tous les jobs soient identiques. Dans le cas contraire, la solution ainsi construite n'est plus certaine d'etre optimale.
 */
class GSolverBBPv3NoWaitMaster : public GSolverBBPv3NoWait {
 private:

#ifdef GMPI
  MPI_Request request_bestevalfromslave ;
  MPI_Request request_endworkfromslave ;
  MPI_Request request_workfromslave ;
  MPI_Request request_besteval[MAX_SLAVES] ;

  // Number of waiting slaves
  int nbrWaitingSlaves ;
  int maxWaitingSlaves ;
  int slaveIsWaiting[MAX_SLAVES] ;
#endif

 public:
  GSolverBBPv3NoWaitMaster(GSupplyLinkProblem& pb, int node_, int p_=0) ;
  virtual ~GSolverBBPv3NoWaitMaster() {} 
  
  virtual void solveInit() ;
  virtual void solveMain() ;

#ifdef GMPI
  void    testForBestEvalMsgFromSlave() ;
  int     testForEndWorkMsgFromSlave() ;

  int     dispatchWorkToSlave(searchnode& treenodechild) ;
#endif

  // check the MPI communication is different
  virtual void testForMPIComm() ;

  // the work to do when a better solution is found
  virtual void sendMPICommForBestSolution(double) ;

  // the work to do before exploring further the search tree
  virtual int dispatchWork(searchnode&) ;

} ;

#endif
